package com.ruoyi.common.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;

public class OrderNumberGenerator {
    // 格式化日期的模式
    private static final String DATE_FORMAT_PATTERN = "yyyyMMddHHmmss";
    // 流水号的初始值
    private static final int INITIAL_SEQUENCE = 0;
    // 流水号的最大数值
    private static final int MAX_SEQUENCE = 9999;
    // 流水号的固定位数
    private static final int SEQUENCE_DIGITS = 4;

    // 用于生成日期格式的线程安全的SimpleDateFormat
    private static final ThreadLocal<SimpleDateFormat> DATE_FORMAT_THREAD_LOCAL =
            ThreadLocal.withInitial(() -> new SimpleDateFormat(DATE_FORMAT_PATTERN));

    // 原子计数器，用于生成流水号，确保线程安全
    private static final AtomicInteger sequence = new AtomicInteger(INITIAL_SEQUENCE);

    /**
     * 生成下一个订单号
     * @return 格式为"日期+流水号"的订单号，如202507281234560001
     */
    public static synchronized String nextOrderNumber() {
        // 获取当前日期字符串
        String datePart = formatCurrentDate();

        // 获取流水号并递增
        int currentSequence = sequence.getAndIncrement();

        // 当流水号达到最大值时，重置为初始值
        if (currentSequence >= MAX_SEQUENCE) {
            sequence.set(INITIAL_SEQUENCE);
            currentSequence = INITIAL_SEQUENCE;
        }

        // 格式化流水号，不足位数时前补零
        String sequencePart = String.format("%0" + SEQUENCE_DIGITS + "d", currentSequence);

        // 组合日期和流水号部分
        return datePart + sequencePart;
    }

    /**
     * 格式化当前日期为字符串
     * @return 格式化后的日期字符串
     */
    private static String formatCurrentDate() {
        return DATE_FORMAT_THREAD_LOCAL.get().format(new Date());
    }

    // 示例使用
    public static void main(String[] args) {
        // 生成10个测试订单号
        for (int i = 0; i < 10; i++) {
            System.out.println("生成的订单号: " + nextOrderNumber());
            try {
                // 模拟处理延迟
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
